package com.xsz.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.Configuration;
/**
 * 
 * @author jiyu
 *
 *execution(* com.sample.service.impl..*.*(..))

解释如下：

 

符号	含义
execution（）	表达式的主体；
第一个”*“符号	表示返回值的类型任意；
com.sample.service.impl	AOP所切的服务的包名，即，我们的业务部分
包名后面的”..“	表示当前包及子包
第二个”*“	表示类名，*即所有类。此处可以自定义，下文有举例
.*(..)	表示任何方法名，括号表示参数，两个点表示任何参数类型


AspectJ中的exection表达式小结：

 

基本语法格式为：

execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)  除了返回类型模式、方法名模式和参数模式外，其它项都是可选的。

下面，我们给出各种使用execution()函数实例。
 */
@Aspect
@Configuration
public class AroundExample {
	
	//com.xsz.controller下面所有无参的方法执行之前，
	//都会先执行这个方法
	
	/**
	 * execution(* com.xsz.controller.*.*())
	 *  第一个* 表示方法的返回类型，*表示任意类型
	 * com.xsz.controller 表示包的名字
	 * 第二个*表示类的名字，*表示任意类名字
	 * 第三个*必须是()之前，表示方法的名字，*表示任意方法名字
	 * () 表示方法没有输入参数， 
	 * (..) 表示方法有多个参数
	 *  (*)  表示方法有一个参数，参数类型任意
	 */
	@Around("execution(* com.xsz.controller.*.*())")
	public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        // start stopwatch
		System.out.println("spring的 AOP @@Around****1检测到无参的方法 被执行了");
        //Object retVal = pjp.proceed();
        Object retVal = pjp.proceed();
        System.out.println("spring的 AOP @@Around*****2检测到无参的方法 被执行了");
        // stop stopwatch
        return retVal;
    }
}


